package me.gacl.websocket.server;


import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashSet;
import java.util.Set;

/**
 * WebSocket处理类, 使用J2EE7的标准
 * @ServerEndpoint 注解是一个类层次的注解，它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 * Created by 孤傲苍狼 on 2016/2/25.
 */
@ServerEndpoint("/webSocketServer")
public class WebSocketServerEndPoint {

    //存储连接上来的WebSocket客户端的Session,每一个Session代表了一个WebSocket客户端对象
    private static Set<Session> sessions = new HashSet<Session>();

    /**
     * 打开连接时触发
     * @param session
     */
    @OnOpen
    public void onOpen(Session session){
        //每当有一个新的WebSocket客户端连接上来时,就会产生一个Session,Session的Id为一个数字,从0开始
        String sessionId = session.getId();
        System.out.println("WebSocket客户端的SessionId为:"+ sessionId);
        sessions.add(session);
    }

    /**
     * 收到客户端消息时触发
     * @param message
     * @return
     */
    @OnMessage
    public void onMessage(Session session,String message) {
        System.out.println("收到消息:"+message);
        //将接收到的消息直接发出去
        sendMsgToAll(message);
    }

    /**
     * 异常时触发
     * @param session
     */
    @OnError
    public void onError(Throwable throwable, Session session) {
        throwable.printStackTrace();
        session.getAsyncRemote().sendText("sessionId为"+session.getId()+"WebSocket连接出错，原因是："+throwable.getMessage());

    }

    /**
     * 关闭连接时触发
     * @param session
     */
    @OnClose
    public void onClose(Session session,CloseReason closeReason) {
        System.out.println("sessionId为"+session.getId()+"的WebSocket连接已经被迫关闭，关闭的原因是："+closeReason);
    }

    /**
     * 发送消息给所有的客户端
     * @param message 需要发送的消息
     */
    private void sendMsgToAll(String message) {
        for (Session client : sessions) {
            //发送消息到指定的client
            synchronized (client) {
                client.getAsyncRemote().sendText(message);
            }
        }
    }
}
